package com.credithc.signature.job.workshop;


import com.credithc.signature.job.po.Task;

import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentLinkedQueue;

public abstract class AbstractWorker implements Runnable {

    /**
     * worker持有Master的任务列表,从中拿取任务
     */
    private ConcurrentLinkedQueue<Task> workQueue = new ConcurrentLinkedQueue<Task>();

    /**
     * worker持有Master的结果列表,将计算结果放进去(结果集一)
     */
    private ConcurrentHashMap<Integer, Object> resultMap = new ConcurrentHashMap<Integer, Object>();

    /**
     * 存放任务
     *
     * @param workQueue
     */
    public void setWorkQueue(ConcurrentLinkedQueue<Task> workQueue) {
        this.workQueue = workQueue;
    }

    /**
     * 存放结果
     *
     * @param resultMap
     */
    public void setResultMap(ConcurrentHashMap<Integer, Object> resultMap) {
        this.resultMap = resultMap;
    }

    /**
     * 可以根据任务类型的不同，分配给不同的工作者
     */
    @Override
    public void run() {
        while (true) {
            //从队列中取出任务
            Task task = this.workQueue.poll();
            if (null == task) {
                break;
            }
            //真正的去做业务处理
            Object result = handle(task);
            //存放任务的结果
            this.resultMap.put(task.getTaskId(), result);
        }
    }

    /**
     * 具体的实现交给子类实现
     *
     * @param task
     * @return
     */
    public abstract Object handle(Task task);
}
